#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/4/9 15:31
# @Author  : hqu-jcl
# @Site    : 
# @File    : GrayScaleTransformation.py


'''
    对数变换和指数变换
    数字图像实验一
'''

import cv2
import os
import numpy as np
import math
import matplotlib.pyplot as plt


def scale_log(c: float, pixel: float):
    '''
        对数变换
    :param c:  系数
    :param pixel: 像素点
    :return:  变换结果
    '''
    return c * math.log10(1 + pixel)


def scale_exp(c, pixel, b):
    '''
        指数变换
    :param c: 系数
    :param pixel: 像素点
    :param b: γ
    :return: 变换后结果
    '''
    return c * math.pow(pixel, b)


def transform(img, fun_type: int, c1=2, _c=3, _b=2):
    '''

    :param img: 图像矩阵
    :param _b: 幂律变换参数
    :param _c:
    :param c1: 对数变换参数
    :param fun_type: fun_type==1 对数变换;
    :param fun_type: fun_type==2 幂律变换;
    :return: 变换后的图片
    '''

    img_array = np.array(img, dtype=np.float32)

    for i in range(len(img_array)):
        for j in range(len(img_array[0])):

            # 对每个像素点进行操作,如果为fun_type为1则进行对数变换,为2进行指数变换
            if fun_type == 1:
                img_array[i][j] = scale_log(c=c1, pixel=img_array[i][j])
            elif fun_type == 2:
                img_array[i][j] = scale_exp(c=_c, b=_b, pixel=img_array[i][j])

            # 输出溢出点
            if img_array[i][j] < 0 or img_array[i][j] > 255:
                print(img_array[i][j])

    # 最大最小归一化
    cv2.normalize(img_array, img_array, 0, 255, cv2.NORM_MINMAX)

    # cv2.convertScaleAbs(img_array)
    img_array = img_array.astype(np.uint8)
    print(img_array)
    return img_array


# 主函数测试
if __name__ == '__main__':

    img = cv2.imread('../resource/f3.jpg', 0)
    # cv2.imshow('Img',mat=img)
    # cv2.waitKey(0)
    temp = []
    print(np.array(img).dtype)

    '''--------------批量调参------'''

    # for i in np.arange(0,0.1,0.01):
    #     print(i)
    #     temp.append(transform(img,fun_type=2,_c=i,_b=2))
    # temp = np.hstack(temp)

    '''-------------调参--------'''

    temp = transform(img, fun_type=1, c1=50)
    cv2.namedWindow('temp', cv2.WINDOW_NORMAL | cv2.WINDOW_KEEPRATIO)
    cv2.imshow('temp', temp)
    cv2.imwrite(filename="../output/output1.bmp", img=temp)
    cv2.waitKey(0)
    # for i in range(len(temp)):
    #     cv2.imshow('temp',mat=temp[i])
    #     cv2.waitKey(0)
